package cn.bearspark.common.util;

import org.springframework.beans.BeanInstantiationException;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 实现两个相似类对象之间的转换的工具类
 *
 * @author f
 */
public class ConvertBeanUtil {

    /**
     * 将一个对象转成目标对象
     *
     * @param source      源对象
     * @param targetClass 目标对象的 Class 对象
     * @param <T>         目标对象的类型
     * @return 带有源对象字段值的目标对象
     */
    public static <T> T convert(Object source, Class<T> targetClass) {
        if (source == null) {
            return null;
        }
        T t = newInstance(targetClass);
        BeanUtils.copyProperties(source, t);
        return t;
    }

    /**
     * 将一些对象都转换成目标对象
     * <p>
     * 注意：集合的实现类是 ArrayList
     *
     * @param sourceCollection 源对象集合
     * @param targetClass      目标对象的 Class 对象
     * @param <T>              目标对象的类型
     * @return 带有源对象字段值的目标对象集合
     */
    public static <T> List<T> convertList(Collection<?> sourceCollection, Class<T> targetClass) {
        if (sourceCollection == null) {
            return null;
        }
        List<T> targetList = new ArrayList<>(sourceCollection.size());
        for (Object source : sourceCollection) {
            targetList.add(convert(source, targetClass));
        }
        return targetList;
    }

    // 使用反射，根据 targetClass 创建该类的对象
    private static <T> T newInstance(Class<T> targetClass) {
        try {
            return targetClass.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new BeanInstantiationException(targetClass, "instantiation error", e);
        }
    }

}
